package gsw.tool.pluggable.hook.handler;

import java.lang.reflect.Method;

/**
 * 分发方法
 * BaseHandlerClass用来统一处理系统对象，对其方法进行扩展。BaseHandlerMethod用来定义怎么扩展系统对象的方法。
 */
public class BaseHandlerMethod {
    //返回给系统的结果
    private Object userMyResult;

    /**
     * 设置处理结果
     *
     * @param userMyResult
     */
    public void setUserMyResult(Object userMyResult) {
        this.userMyResult = userMyResult;
    }

    /**
     * 对系统的方法进行扩展
     *
     * @param receiver 系统对象
     * @param method   执行方法
     * @param args     执行方法的参数
     * @return 系统的方法的执行结果
     */
    public Object doHookInnner(Object receiver, Method method, Object[] args) {
        //是否需要执行系统的方法
        boolean isNeedDo = beforeInvoke(receiver, method, args);
        try {
            //如果需要执行系统的方法，就返回系统方法的执行结果；否则，在beforeInvoke或afterInvoke中设置返回结果
            if (isNeedDo) {
                //系统的方法的执行结果
                Object invokeResult = method.invoke(receiver, args);
                //将结果返回给系统
                setUserMyResult(invokeResult);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        afterInvoke(receiver, method, args);
        return userMyResult;
    }

    /**
     * 系统的方法执行前的操作
     *
     * @param receiver 系统对象
     * @param method   执行方法
     * @param args     执行方法的参数
     * @return 是否需要执行系统的方法
     */
    protected boolean beforeInvoke(Object receiver, Method method, Object[] args) {
        return true;
    }

    /**
     * 系统的方法执行后的操作
     *
     * @param receiver 系统对象
     * @param method   执行方法
     * @param args     执行方法的参数
     */
    protected void afterInvoke(Object receiver, Method method, Object[] args) {
    }

}
